/**
 * esprima  解析器，可以将源代码转换成ast语法树
 * estraverse  可以帮我们遍历语法树，以深度优先的方式遍历语法树
 * escodegen   js代码生成器,将ast语法转成代码
 */

const esprima = require('esprima')
const estraverse = require('estraverse')
const escodegen = require('escodegen')

const code = `function ast(){}`

let ast = esprima.parse(code)
let indent = 0
let padding = () => ' '.repeat(indent)
estraverse.traverse(ast, {
  enter(node){
    console.log(padding() + node.type + '进入');
    indent+=2
  },
  leave(node){
    console.log(padding() + node.type + '离开');
    indent-=2
  }
})

let result = escodegen.generate(ast)